home *** CD-ROM | disk | FTP | other *** search
- /*
- new file select
- 1993.6.27 v1.0
- copyright Y.Ouchi
- */
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/extender.h>
- #include "egb.h"
- #include "mos.h"
- #include "bb.h"
-
- /* 関数プロトタイプ宣言 */
- extern char egbwork[];
- extern char moswork[];
- extern void linedsp(int, int, char *);
- extern void linedspv(int, int, char *, int, unsigned int, unsigned int);
- extern void linedspvl(int,int,char *,int,int,unsigned int,unsigned int);
- extern void box(int, int, int, int, int, int);
- extern void line(int, int, int, int, int);
- extern int panelread(int, struct panel *, int);
- extern void panelinit(int, struct panel *, char **, int );
- extern int crfindb(int, char *, int *, int *);
- extern int crfindl(int, char *, int *, int *);
- void init_disp(void);
- int fileheaddsp(char *);
- void fileheadclr(void);
-
- char *drivename[16]={"A","B","D","E","F","G","H","I",
- "J","K","L","M","N","O","P","Q"};
- char driveflag[16]={0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
- struct panel n_menu[2];
- char files[256][15];
- static int fdisp;
- static int fdispx=0,fdispy=400;
- static int px=120,py=50;
-
- char * filesel ( void )
- {
- static char filename[128]={"p:/src/readme.doc"};
- char flag,fflag,subdir;
- int i,j,disp_start_no;
- int atrib,res,file_no,menu_res,cdriveno;
- char *work_char_ad;
- char motherdir[8]={".."};
- char wild[8]={"*.*"};
- char dirchange[]={".. upper dir"};
- char cdir[128];
- char cdrive[4]={"X:"};
- char path[128];
- char enqfile[128];
- char workfile[128];
- char buf[128];
- struct _disk_space ds;
-
- /* initial display */
- init_disp( );
- fileheadclr();
-
- EGB_writePage(egbwork,0);
- EGB_color(egbwork, 0, TEXT_COL);
-
- /* current drive & current path get */
- cdriveno=_dos_get_default_disk_number();
- cdrive[0]=0x41+cdriveno;
- getcwd(cdir,128);
- flag=1;
- do{
- box(px+16,py+16,px+53,py+53,BOTAN_COL,1);
- box(px+66,py+36,px+173,py+53,BOTAN_COL,1);
- EGB_color(egbwork, 0, NAME_COL);
- EGB_fontStyle(egbwork, 1);
- if (cdriveno>1) linedsp(px+28,py+42,drivename[cdriveno-1]);
- else linedsp(px+28,py+42,drivename[cdriveno]);
- EGB_fontStyle(egbwork, 0);
- if (strlen(cdir)>1){
- for(i=strlen(cdir)-1;i>=0;i--) if(cdir[i]==0x2f) break;
- linedsp(px+67,py+52,&cdir[i+1]);
- subdir=1;
- files[0][0]=0x00;
- strcpy(files[0],dirchange);
- }
- else{
- linedsp(px+67,py+52,cdir);
- subdir=0;
- }
- EGB_color(egbwork, 0, TEXT_COL);
-
- path[0]=0x00;
- strcat(path,cdrive);
- strcat(path,cdir);
- i=strlen(path);
- if (path[i-1]!=0x2f){
- path[i]=0x2f;
- path[i+1]=0x00;
- }
- for ( i=0;i<strlen(path);i++) if (path[i]==0x2f) path[i]=0x5c;
- enqfile[0]=0x00;
- strcpy(enqfile,path);
- strcat(enqfile,wild);
-
- /* file names get */
- _dos_set_disk_transfer_area_address(buf);
- if (subdir==0) file_no=0;
- else file_no=1;
- atrib=22;
- res=_dos_find_first(enqfile,atrib);
- while (res==0){
- work_char_ad=buf+30;
- if (work_char_ad[0]!=0x2e){
- workfile[0]=0x00;
- strcat(workfile,path);
- strcat(workfile,work_char_ad);
- if ((_get_file_mode(workfile) & 0x4000)==0x4000){
- files[file_no][0]=0x20;
- files[file_no][1]=0x00;
- strcat(files[file_no],work_char_ad);
- i=strlen(files[file_no]);
- files[file_no][i]=0x3e;
- files[file_no][i+1]=0x00;
- }
- else{
- files[file_no][0]=0x00;
- strcat(files[file_no],work_char_ad);
- }
- file_no++;
- }
- res=_dos_find_next( ) ;
- }
-
- if (subdir==0){
- work_char_ad=files[0];
- i=file_no;
- }
- else{
- work_char_ad=files[1];
- i=file_no-1;
- }
- qsort(work_char_ad,i,15,(int *)strcmp);
-
- for (i=0;i<file_no;i++) if (files[i][0]==0x20) files[i][0]=0x3c;
-
- disp_start_no=0;
- fflag=1;
- while ( fflag ){
- box(px+15,py+125,px+174,py+324,BACK_COL,1);
- EGB_color(egbwork, 0, TEXT_COL);
- for ( j=0;j<10;j++ ){
- if (disp_start_no+j>=file_no) break;
- linedspv(px+47,py+142+j*20,files[disp_start_no+j],
- 0,TEXT_COL,BACK_COL);
- }
- while ( (menu_res = panelread (2, n_menu, 1)) >= 2000 );
- if ( menu_res<100 ){
- if (menu_res==0 || menu_res==1){
- cdriveno=menu_res;
- cdrive[0]=0x41+menu_res;
- _dos_select_disk(menu_res);
- getcwd(cdir,128);
- fflag=0;
- }
- else{
-
-
- ds=_dos_get_disk_space(menu_res+2);
- if (ds.nsectors!=0xffff){
- cdriveno=menu_res+1;
- cdrive[0]=0x42+menu_res;
- _dos_select_disk(menu_res+1);
- getcwd(cdir,128);
- fflag=0;
- }
- /*****************************************************
- if (driveflag[menu_res]==0x01){
- cdriveno=menu_res+1;
- cdrive[0]=0x42+menu_res;
- _dos_select_disk(menu_res+1);
- getcwd(cdir,128);
- fflag=0;
- }
- *****************************************************/
-
-
- }
- fileheadclr();
- }
- else{
- if (menu_res==100){
- if (disp_start_no+10<file_no){
- disp_start_no=disp_start_no+10;
- }
- }
- else{
- if ( menu_res==1100 ){
- if (disp_start_no-10>=0){
- disp_start_no=disp_start_no-10;
- }
- }
- else{
- if ( menu_res<1000 ){
- j=disp_start_no+menu_res-101;
- if(j==0 && subdir==1){
- enqfile[0]=0x00;
- strcpy(enqfile,path);
- strcat(enqfile,motherdir);
- chdir(enqfile);
- getcwd(cdir,128);
- fflag=0;
- fileheadclr();
- }
- else{
- if (j<file_no){
- if (files[j][0]==0x3c
- && files[j][strlen(files[j])-1]
- ==0x3e){
- enqfile[0]=0x00;
- strcpy(enqfile,path);
- strcat(enqfile,&files[j][1]);
- enqfile[strlen(enqfile)-1]=0x00;
- chdir(enqfile);
- getcwd(cdir,128);
- fflag=0;
- fileheadclr();
- }
- else{
- if(j==fdisp){
- filename[0]=0x00;
- strcat(filename,path);
- strcat(filename,files[j]);
- fflag=0;
- flag=0;
- }
- else{
- if(fileheaddsp(files[j])!=0)
- fdisp=j;
- }
- }
- }
- }
- }
- else{
- filename[0]=0x00;
- fflag=0;
- flag=0;
- }
- }
- }
- }
- }
- }while ( flag );
-
- MOS_disp( 0 );
- MOS_horizon( 0,639 );
- MOS_vertical( 0,479 );
- EGB_clearScreen(egbwork);
- EGB_color(egbwork, 0, TEXT_COL);
- EGB_color(egbwork, 1, BACK_COL);
-
- return(filename);
-
- }
-
- /*
- initial panel display
- */
-
- void init_disp( )
- {
- char pagechar[21]={"▲ page up/down ▼"};
- int i;
- struct _disk_space ds;
-
- EGB_writePage(egbwork,0);
- box(px,py,px+189,py+339,FILES_BACK_COL,1);
-
- box(px+15,py+15,px+54,py+54,BOTAN_COL,1);
- box(px+65,py+35,px+174,py+54,BOTAN_COL,1);
- line(px+15,py+15,px+54,py+15,SHADOW);
- line(px+15,py+15,px+15,py+54,SHADOW);
- line(px+15,py+54,px+54,py+54,HILIGHT);
- line(px+54,py+15,px+54,py+54,HILIGHT);
-
- line(px+65,py+35,px+174,py+35,SHADOW);
- line(px+65,py+35,px+65,py+54,SHADOW);
- line(px+65,py+54,px+174,py+54,HILIGHT);
- line(px+174,py+35,px+174,py+54,HILIGHT);
-
- box(px+15,py+105,px+174,py+124,BOTAN_COL,1);
- box(px+15,py+125,px+174,py+274,BACK_COL,1);
-
- EGB_color(egbwork, 0, TEXT_COL);
- linedsp(px+23,py+122,pagechar);
-
- /******************************** test
- for (i=4;i<17;i++){
- ds=_dos_get_disk_space(i);
- if (ds.nclusters>=0xffff){
- drivename[i-2][0]=0x81;
- drivename[i-2][1]=0x7c;
- driveflag[i-2]=0x00;
- }
- else{
- driveflag[i-2]=0x01;
- }
- }
- ********************************/
-
- n_menu[0].xpos=px+15;
- n_menu[0].ypos=py+65;
- n_menu[0].xsize=160;
- n_menu[0].ysize=40;
- n_menu[0].xbtnsize=20;
- n_menu[0].ybtnsize=20;
- n_menu[0].ful=1;
- n_menu[0].disp=1;
- n_menu[0].ini_digit=0;
-
- panelinit(1,n_menu,drivename,1);
-
- n_menu[1].xpos=px+15;
- n_menu[1].ypos=py+105;
- n_menu[1].xsize=160;
- n_menu[1].ysize=220;
- n_menu[1].xbtnsize=160;
- n_menu[1].ybtnsize=20;
- n_menu[1].ful=0;
- n_menu[1].disp=1;
- n_menu[1].ini_digit=100;
-
- MOS_horizon( px+15,px+174 );
- MOS_vertical( py+65,py+324 );
- MOS_setpos( px+50, py+135 );
- MOS_disp( 1 );
- }
-
- /*
- file head display
- */
-
- int fileheaddsp(char *fn)
- {
- int filesize;
- int lineleng,nextp1,nextp2,nextp3;
- FILE *inFp;
- char txt[250];
-
- inFp=fopen(fn,"rb");
- if(inFp==NULL) return(0);
- filesize=fread(txt,1,240,inFp);
- fclose(inFp);
- if (filesize<=0) return(0);
-
- EGB_writePage(egbwork,0);
- box(fdispx,fdispy,fdispx+639,fdispy+51,BOTAN_COL,1);
- crfindl(filesize,txt,&lineleng,&nextp1);
- linedspvl(fdispx,fdispy+16,txt,lineleng,0,TEXT_COL,BOTAN_COL);
- if(nextp1>0){
- crfindl(filesize-lineleng,&txt[nextp1],&lineleng,&nextp2);
- linedspvl(fdispx,fdispy+33,&txt[nextp1],lineleng,
- 0,TEXT_COL,BOTAN_COL);
- if(nextp2>0){
- crfindl(filesize-lineleng,&txt[nextp1+nextp2],&lineleng,&nextp3);
- linedspvl(fdispx,fdispy+50,&txt[nextp1+nextp2],lineleng,
- 0,TEXT_COL,BOTAN_COL);
- }
- EGB_color(egbwork, 0, TEXT_COL);
- return(1);
- }
- else{
- EGB_color(egbwork, 0, TEXT_COL);
- return(0);
- }
- }
-
- /*
- file head display clear
- */
-
- void fileheadclr( )
- {
- fdisp=-1;
- box(fdispx,fdispy,fdispx+639,fdispy+51,BACK_COL,1);
- }
-
-